package com.xunk.equipment.service.zhijia.vo;

import com.xunk.common.core.enums.SupplierEnum;
import com.xunk.equipment.domain.EquipmentDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Optional;

/**
 * @ProjectName: HIM
 * @Package: com.xunk.equipment.service.zhijia.vo
 * @ClassName: DeviceInfoVO
 * @Author: luanzhiwei
 * @Description: 智家设备实体类
 * @Date: 2021/4/9 14:18
 * @Version: 1.0
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class DeviceInfoVO {
    /**
     * 设备名称，等同于别名
     */
    private String deviceName;
    /**
     * 设备ID
     */
    private String deviceId;
    /**
     * 设备图片地址
     */
    private String deviceImg;
    /**
     * 设备wifitype
     */
    private String wifiType;
    /**
     * 设备类别
     */
    private String deviceType;
    /**
     * 是否在线
     */
    private Boolean online;
    /**
     * 产品型号名称
     */
    private String productNameT;
    /**
     * 产品型号编码
     */
    private String productCodeT;
    /**
     * 权限和，权限信息的综合
     */
    private AuthInfo totalPermission;
    /**
     * 权限信息
     */
    private List<Permission> permissions;
    /**
     * 设备角色：1 普通设备;2 网关设备;3 附件设备;4 子设备;仅返回数字，角色信息不返回
     */
    private String deviceRole;
    /**
     * 主设备Id：若该设备本身为主设备，该字段为null；若该设备为从设备，该字段为主设备Id
     */
    private String parentDeviceId;
    /**
     * 设备类别：三种：主设备；从设备；无
     */
    private String deviceRoleType;
    /**
     * 所属从设备Id的集合：若无从设备该字段为空
     */
    private List slaveDeviceIds;
    /**
     * 设备品牌
     */
    private String brand;
    /**
     * 品牌编码
     */
    private String brandCode;

    /**
     * 是否拥有完整权限
     *
     * @return
     */
    public boolean isVSC() {
        final Optional<Boolean> any = permissions.stream().map(item -> item.getAuth().isVSC()).findAny();
        if (any.isPresent()) {
            return any.get();
        }
        return false;
    }

    /**
     * 转为EquipmentDO
     *
     * @return
     */
    public EquipmentDO extract() {
        final EquipmentDO equipmentDO = new EquipmentDO();
        equipmentDO.setDeviceOnline(this.getOnline() ? 1L : 0L);
        equipmentDO.setDeviceSn(this.getDeviceId());
        equipmentDO.setParentSn(this.getParentDeviceId());
        equipmentDO.setBrand(this.getBrand());
        equipmentDO.setSupplier(SupplierEnum.UPLUS.getSupplierName());
        equipmentDO.setSpecModel(this.getDeviceType());
        equipmentDO.setDeviceNickname(this.getDeviceName());
        return equipmentDO;
    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    public static class AuthInfo {
        /**
         * 是否有查看权
         */
        private Boolean view;
        /**
         * 是否有配置权限
         */
        private Boolean set;
        /**
         * 是否有控制权
         */
        private Boolean control;

        /**
         * 是否拥有完整权限
         *
         * @return
         */
        public boolean isVSC() {
            return view && control;
        }
    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    public static class Permission {
        /**
         * 权限内容
         */
        private AuthInfo auth;
        /**
         * 权限类型	home:家庭分享，share：个人分享，owner：设备主人，server：给appserver的权限
         */
        private String authType;
    }

}
